package com.mh.web.controller.system;

import com.mh.common.core.controller.BaseController;
import com.mh.common.core.domain.BaseResp;
import com.mh.common.utils.UserConstants;
import com.mh.system.domain.SysDept;
import com.mh.system.service.SysDeptService;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.Iterator;
import java.util.List;

@RestController
@RequestMapping("/system/dept")
public class SysDeptController extends BaseController {

    @Autowired
    private SysDeptService sds;

    @GetMapping("/list")
    @PreAuthorize("@MyPermsCheck.checkPerm('system:dept:list')")
    public BaseResp findDeptAll() {
        List<SysDept> depts = sds.selectAllDept();
        return BaseResp.success(depts);
    }

    //1. 根据部门编号,获取详细信息
    @GetMapping("/{deptID}")
    public BaseResp getInfo(@PathVariable Long deptID) {
        return BaseResp.success(sds.selectDeptById(deptID));
    }

    //2. 新增
    @PostMapping
    public BaseResp addDept(@RequestBody SysDept dept) {

        //.checkDeptNameUnique的结果为NOT_UNIQUE(不唯一,已存在)的话,返回失败
        if (UserConstants.NOT_UNIQUE.equals(sds.checkDeptNameUnique(dept))) {
            return BaseResp.error("新增部门:[" + dept.getDeptName() + "]已存在,不可添加");
        }
        //否则调用Service的插入数据方法
        return toAjax(sds.insertDept(dept));
    }

    //3. 修改上级部门
    @PutMapping
    public BaseResp updateDept(@RequestBody SysDept dept) {
        //.checkDeptNameUnique的结果为NOT_UNIQUE(不唯一,已存在)的话,进入下一个判断
        if (UserConstants.NOT_UNIQUE.equals(sds.checkDeptNameUnique(dept))) {
            return BaseResp.error("修改部门:[" + dept.getDeptName() + "]已存在,不可修改");
        }
        //deptId & parentId 不能一样
        else if (dept.getDeptId().equals(dept.getParentId())) {
            return BaseResp.error("修改部门:[" + dept.getDeptName() + "]失败,上级部门与当前部门不可一样");
        }
        return toAjax(sds.updateDept(dept));
    }

    //4. 删除
    @DeleteMapping("/{deptId}")
    public BaseResp deleteDept(@PathVariable Long deptId) {
        //判断要删除的部门是否有下级部门-->有就返回失败
        if (sds.hasChildByDeptId(deptId)) {
            return BaseResp.error("该部门有下级部门,不可删除");
        }
        //判断要删除的部门是否有员工(用户表中是否有该deptId)-->有就返回失败
        if (sds.checkDeptExistUser(deptId)) {
            return BaseResp.error("该部门中有员工,不可删除");
        }
        return toAjax(sds.deleteDeptById(deptId));
    }

    //5. 获取部门树形结构
    @GetMapping("/treeSelect")
    public BaseResp treeSelect(SysDept sysDept) {
        List<SysDept> sysDepts = sds.selectDeptList(sysDept);
        return BaseResp.success(sds.buildDeptTreeSelect(sysDepts));
    }

    //6. 排除当前节点 & 当前节点的下级 --> 最终返回过滤后的列表
    //前端修改上级部门时,会向后端发送2个请求-->一个是修改请求,一个是不显示当前节点及子级的请求
    @GetMapping("/list/exclude/{deptId}")
    public BaseResp exclude(@PathVariable Long deptId) {
        //查询全部信息
        List<SysDept> depts = sds.selectAllDept();
        //通过迭代器遍历(效率更高)
        Iterator<SysDept> iterator = depts.iterator();
        while (iterator.hasNext()) {
            SysDept dept = iterator.next();
            //查询结果中删除如下2种情况
            //情况1: 查询结果中的id = 传入的部门id --> 为了限制上级部门选自己(上级部门选项中不出现当前部门)
            if (dept.getDeptId().longValue() == deptId.longValue() ||
                //情况2: 查询结果中的祖籍列表, 用","隔开, 生成一个Long[], 判断这个数组中是否有传入的部门id
                //有的话表示那条数据是当前部门的子级 --> 为了限制上级部门选自己的下级部门(上级部门选项中不出现子级)
                ArrayUtils.contains(StringUtils.split(dept.getAncestors(),","),deptId+"")) {
                iterator.remove();
            }
        }
        return BaseResp.success(depts);
    }
}
